﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmOPAlta : Form
    {
        public PartnerDTO Partner { get; set; }
        public ProductoDTO Producto { get; set; }
        public DataTable items = new DataTable();

        public frmOPAlta()
        {
            InitializeComponent();
        }

        private void frmOPAlta_Load(object sender, EventArgs e)
        {
            items = new DataTable();
            items.Columns.Add("IdProducto", typeof(int));
            items.Columns.Add("Producto");
            items.Columns.Add("Cantidad", typeof(decimal));
            items.Columns.Add("Observaciones");
            items.AcceptChanges();

            FillGrid();
            btProducto.Enabled = false;
            grpItems.Enabled = false;
            //nCantidad.ResetText();
            //btGuardar.Enabled = false;
        }

        private void btPartner_Click(object sender, EventArgs e)
        {
            using (frmPartnerConsulta f = new frmPartnerConsulta())
            {
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    //CleanControls();
                    this.Partner = f.Partner;
                    txPartner.Text = Partner.Nombre;

                    btProducto.Enabled = true;
                    grpItems.Enabled = true;
                }
            }
        }

        private void CleanControls()
        {
            this.Partner = null;
            this.Producto = null;
            txPartner.Text = string.Empty;
            txProducto.Text = string.Empty;
            gvItems.DataSource = null;
        }

        private void btProducto_Click(object sender, EventArgs e)
        {
            using (frmProductoSeleccionOPTerminado f = new frmProductoSeleccionOPTerminado())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.Producto = f.Producto;
                    txProducto.Text = string.Format("{0} [{1}] | {2}", 
                        this.Producto.Nombre, 
                        this.Producto.Codigo, 
                        this.Producto.Tipo); 
                }
            }
        }

        private void picProductoDetalle_Click(object sender, EventArgs e)
        {
            if (this.Producto != null)
            {
                using (frmProductoDetalle f = new frmProductoDetalle())
                {
                    f.Producto = this.Producto;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Producto para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void picPartnerDetalle_Click(object sender, EventArgs e)
        {
            if (this.Partner != null)
            {
                using (frmPartnerDetalle f = new frmPartnerDetalle())
                {
                    f.Partner = this.Partner;
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Partner para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information); 
            }
        }



        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Validar())
                {
                    if (gvItems.RowCount == 0)
                    {
                        if (MessageBox.Show("Está a punto de guardar la OP sin Items. ¿Desea continuar de todos modos?",
                            "OP sin Items", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == System.Windows.Forms.DialogResult.No)
                            return;
                    }

                    OP op = BuildOP();
                    op = OrdenesProduccion.Guardar(op);
                    
                    MessageBox.Show("Se guardó la OP exitosamente",
                        "Guardar OP", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    /**/
                    this.Close();    
                    SugerirIRSinOP(op);
                }
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private static void SugerirIRSinOP(OP op)
        {
            using (frmIRSinOPSeleccion f = new frmIRSinOPSeleccion())
            {
                f.Op = op.OrdenProduccion;
                FormsHelper.CargarColumnasGrilla(f);
                f.ShowDialog();
            }
        }

        private OP BuildOP()
        {
            OrdenProduccionDTO cabecera = FillOP();
            List<OrdenProduccionItemDTO> items = FillItems();

            OP op = new OP();
            op.Items = items;
            op.OrdenProduccion = cabecera;

            return op;
        }

        private List<OrdenProduccionItemDTO> FillItems()
        {
            List<OrdenProduccionItemDTO> itemsList = new List<OrdenProduccionItemDTO>();

            foreach (DataRow row in items.Rows)
            {
                OrdenProduccionItemDTO item = new OrdenProduccionItemDTO();
                item.Id = 0;
                item.IdOrdenProduccion = 0;
                item.Cantidad = (decimal)row["Cantidad"];
                item.CantidadCorregida = (decimal)row["Cantidad"];
                item.CoeficienteCorreccion = 1;
                item.IdProducto = (int)row["IdProducto"]; ;
                item.Obs = row["Observaciones"].ToString();
                item.Activo = true;
                item.IdStock = null;

                itemsList.Add(item);
            }

            return itemsList;
        }

        private OrdenProduccionDTO FillOP()
        {
            OrdenProduccionDTO op = new OrdenProduccionDTO();
            op.IdPartner = this.Partner.Id;
            op.IdProducto = this.Producto.Id;
            op.Fecha = dt.Value;
            op.Cantidad = Convert.ToInt32(FormsHelper.StN(txCantidad.Text));
            op.Activo = true;
            op.NumeroLote = txNumeroLote.Text;
            op.NumeroOP = txNumeroOP.Text;
            op.Obs = txObs.Text;
            op.ObsImpresion = txObsImpresion.Text;
            op.ArchivoPDF = null;
            op.Estado = eOrdenProduccionEstado.ACTIVA.ToString();

            return op;
        }

        private bool Validar()
        {
            errP.Clear();

            if (string.IsNullOrEmpty(txPartner.Text) || string.IsNullOrWhiteSpace(txPartner.Text))
            {
                errP.SetError(picPartnerDetalle, "Se debe seleccionar un Partner.");
                return false;
            }
            if (string.IsNullOrEmpty(txProducto.Text) || string.IsNullOrWhiteSpace(txProducto.Text))
            {
                errP.SetError(picProductoDetalle, "Se debe seleccionar un Producto.");
                return false;
            }
            if (string.IsNullOrEmpty(txNumeroOP.Text) || string.IsNullOrWhiteSpace(txNumeroOP.Text))
            {
                errP.SetError(txNumeroOP, "Se debe escribir un número de OP.");
                return false;
            }
            return true;
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                using (frmOPItem f = new frmOPItem())
                {
                    f.Partner = this.Partner;
                    f.FillControls(
                        Productos.Get((int)gvItems.SelectedRows[0].Cells["IdProducto"].Value),
                        (decimal)gvItems.SelectedRows[0].Cells["Cantidad"].Value,
                        (string)gvItems.SelectedRows[0].Cells["Observaciones"].Value);

                    FormsHelper.CargarColumnasGrilla(f);
                    if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        gvItems.SelectedRows[0].Cells["IdProducto"].Value = f.Item.IdProducto;
                        gvItems.SelectedRows[0].Cells["Producto"].Value = f.Producto.Nombre;
                        gvItems.SelectedRows[0].Cells["Cantidad"].Value = f.Item.Cantidad;
                        gvItems.SelectedRows[0].Cells["Observaciones"].Value = f.Item.Obs;
                    }
                }
            }
        }        
        
        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmOPItem f = new frmOPItem())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    items.Rows.Add(f.Item.IdProducto, 
                        f.Producto.Nombre, 
                        f.Item.Cantidad, 
                        f.Item.Obs);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void FillGrid()
        {
            gvItems.DataSource = null;
            gvItems.DataSource = items;
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("¿Está seguro de que desea quitar el item seleccionado?", 
                    "Quitar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    items.Rows.Remove(
                        ((DataRowView)gvItems.SelectedRows[0].DataBoundItem).Row);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }


        private void gvItems_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            btEdit_Click(sender, e);
        }

        private void txCantidad_Validating(object sender, CancelEventArgs e)
        {
            txCantidad.Text = Convert.ToInt32(FormsHelper.StN(txCantidad.Text)).ToString();
        }

    }
}
